package com.itcam.phaseii.innerclass;

/**
 * 演示匿名内部类的使用
 * （1）本质是类
 * （2）内部类
 * （3）该类没有名字
 * （4）同时还是一个对象
 */
public class AnonymousInnerClass {
    public static void main(String[] args) {
        OuterClass outerClass = new OuterClass();
        outerClass.method();
    }
}

class OuterClass { // 外部类
    private int n1 = 10; // 属性

    public void method() { // 方法
        // 基于接口的匿名内部类
        // 1.想使用AI接口，并创建对象
        // 2.传统方式，是写一个类，实现该类接口，并创建对象
        // 3.需求是Tiger/Dog类只使用一次，后面不再使用
        // 4.可以使用匿名内部类来简化开发
        // 5.tiger的编译类型==》AI
        // 6.tiger的运行类型==》匿名内部类 == OuterClass$1
        // 7.JDK底层创建匿名内部类OuterClass$1，并把地址返回给tiger
        /**
         *  底层：
         *      class XXX implements AI{
         *          @Override
         *          public void cry(){
         *              System.out.println("嗷呜...");
         *          }
         */
//        AI tiger = new Tiger();
//        tiger.cry();
        AI tiger = new AI() {
            @Override
            public void cry() {
                System.out.println("嗷呜...");
            }
        };
        System.out.println("tiger的运行类型是：" + tiger.getClass());
        tiger.cry();


        //演示基于类的匿名内部类
        //分析
        //1. father 编译类型Father
        //2. father 运行类型OuterClass04$2
        //3. 底层会创建匿名内部类
        /**
         * class Outer04$2 extends Father{
         *      @Override
         *      public void test() {
         *          System.out.println("匿名内部类重写了test 方法");
         *      }
         * }
         */
        //4. 同时也直接返回了匿名内部类Outer04$2 的对象
        //5. 注意("jack") 参数列表会传递给构造器
        Father father = new Father("jack") {
            @Override
            public void test() {
                System.out.println("匿名内部类重写了test方法");
            }
        };
        System.out.println("father对象的运行类型 = " + father.getClass());//Outer04$2
        father.test();

        // 基于抽象类的匿名内部类
        Animal animal = new Animal() {
            @Override
            void eat() {
                System.out.println("小狗吃骨头...");
            }
        };
        animal.eat();
    }
}

interface AI { // 接口
    public void cry();
}

//class Tiger implements AI {
//    @Override
//    public void cry() {
//        System.out.println("嗷呜...");
//    }
//}
//
//class Dog implements AI {
//
//    @Override
//    public void cry() {
//        System.out.println("汪汪...");
//    }
//}

class Father { // 类
    public Father(String name) { // 构造器
        System.out.println("接收到name = " + name);
    }

    public void test() { // 方法
    }
}

abstract class Animal { // 抽象类
    abstract void eat();
}
